home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus 2004 #2 / Amiga Plus CD - 2004 - No. 02.iso / AmiSoft / Dev / misc / WHDLoad_dev.lha / WHDLoad / Src / gci / WHDLoadGCI.c < prev    next >
Encoding:
C/C++ Source or Header  |  2003-07-12  |  14.5 KB  |  442 lines

  1. /*****************************************************************************
  2. ;  :Module.    WHDLoadGCI.c
  3. ;  :Author.    Bert Jahn
  4. ;  :EMail.    jah@fh-zwickau.de
  5. ;  :Address.    Franz-Liszt-Straße 16, Rudolstadt, 07404, Germany
  6. ;  :Version.    $Id: WHDLoadGCI.c 0.11 2003/07/12 13:32:27 wepl Exp wepl $
  7. ;  :History.    18.07.98 started
  8. ;        13.12.98 immediate terminate if dump loading fails
  9. ;        02.03.00 expmem stuff added
  10. ;             multiple memory windows
  11. ;        12.07.03 registers can be linked to memwin
  12. ;  :Copyright.    All Rights Reserved
  13. ;  :Language.    C
  14. ;  :Translator.    GCC 2.90.27
  15. ****************************************************************************/
  16.  
  17. #include <stdio.h>
  18. #include <stdlib.h>
  19. #include <string.h>
  20.  
  21. #include <exec/memory.h>
  22. #include <libraries/mui.h>
  23.  
  24. #include <clib/alib_protos.h>
  25. #include <clib/exec_protos.h>
  26. #include <clib/gadtools_protos.h>
  27. #include <clib/muimaster_protos.h>
  28. #include <proto/muimaster.h>
  29.  
  30. #include "whddump.h"
  31. #include "WHDLoadGCI.h"
  32.  
  33. /****************************************************************************/
  34.  
  35. /****************************************************************************/
  36. /* defines                                                                    */
  37. /****************************************************************************/
  38.  
  39. /****************************************************************************/
  40. /* extern functions                                                            */
  41. /****************************************************************************/
  42.  
  43. void    make_win_info    (void);
  44. void    make_win_cpu    (void);
  45. void    make_win_cust    (void);
  46.  
  47. void    wmem_make    (int);
  48. void *    wmem_init    (void);
  49. void    wmem_finit    (void);
  50. void    wmem_goto    (int);
  51.  
  52. void    freedump    (void);
  53. BOOL    loaddump    (STRPTR name);
  54.  
  55. /****************************************************************************/
  56. /* static variables                                                            */
  57. /****************************************************************************/
  58.  
  59. extern struct Library *SysBase,*DOSBase;
  60. struct Library *IntuitionBase;
  61. struct Library *MUIMasterBase;
  62. struct Library *UtilityBase;
  63.  
  64. APTR app = NULL;        /* application */
  65. APTR win;            /* main window */
  66.  
  67. struct whddump_header    * header = NULL;
  68. char            * term = NULL;
  69. struct whddump_cpu    * cpu = NULL;
  70. struct whddump_custom    * custom = NULL;
  71. struct whddump_cia    * ciaa = NULL;
  72. struct whddump_cia    * ciab = NULL;
  73. APTR            * slave = NULL;
  74. APTR            * mem = NULL;
  75. APTR            * emem = NULL;
  76.  
  77. const char* StringHexAccept = "$0123456789abcdefABCDEF";
  78.  
  79. /****************************************************************************/
  80. /* function declarations                                                    */
  81. /****************************************************************************/
  82.  
  83. void    main2        (void);
  84.  
  85. /****************************************************************************/
  86.  
  87. struct NewMenu MenuData[] =
  88. {
  89.     MENUBASE
  90.     { NM_END,NULL,0,0,0,(APTR)0 },
  91. };
  92.  
  93. /****************************************************************************/
  94.  
  95. #ifdef _DCC
  96. int brkfunc(void) { return(0); }
  97. int wbmain(struct WBStartup *wb_startup) {
  98.     extern int main(int argc, char *argv[]);
  99.     return (main(0, (char **)wb_startup));
  100. }
  101. #endif
  102.  
  103. #ifdef __SASC
  104. int CXBRK(void) { return(0); }
  105. int _CXBRK(void) { return(0); }
  106. void chkabort(void) {}
  107. #endif
  108.  
  109. /****************************************************************************/
  110.  
  111. #define btst(i,n) ((i >> n) & 1)
  112.  
  113. char * dmacon_h (void) {
  114.     static char s[252];
  115.     int v = custom->wdcu_regs[0x002/2];
  116.     sprintf(s,MUIX_C MUIX_B "dmacon" MUIX_N MUIX_R "\nBlitter Busy = %d\n"
  117.     "Blitter Zero = %d\nBlitter Priority = %d\nDMA Enable = %d\n"
  118.     "Bitplane Enable = %d\nCopper Enable = %d\nBlitter Enable = %d\n"
  119.     "Sprite Enable = %d\nDisk Enable = %d\nAudio 3 Enable = %d\n"
  120.     "Audio 2 Enable = %d\nAudio 1 Enable = %d\nAudio 0 Enable = %d",
  121.     btst(v,14),btst(v,13),btst(v,10),btst(v,9),btst(v,8),btst(v,7),btst(v,6),
  122.     btst(v,5),btst(v,4),btst(v,3),btst(v,2),btst(v,1),btst(v,0) );
  123.     /*printf("%ld\n",strlen(s));*/
  124.     return s;
  125. }
  126.  
  127. char * int_h (int v, char *s, const char *name) {
  128.     sprintf(s,MUIX_C MUIX_B "int%s" MUIX_N MUIX_R "\nInterrupt Enable = %d\n"
  129.     "CIA-B, Expansion = %d\nDisk = %d\nSerial full = %d\n"
  130.     "Audio 3 = %d\nAudio 2 = %d\nAudio 1 = %d\nAudio 0 = %d\nBlitter = %d\n"
  131.     "Vertical Blank = %d\nCopper = %d\nCIA-A, Expansion = %d\nSoft = %d\n"
  132.     "Disk = %d\nSerial empty = %d",
  133.     name,btst(v,14),btst(v,13),btst(v,12),btst(v,11),btst(v,10),btst(v,9),
  134.     btst(v,8),btst(v,7),btst(v,6),btst(v,5),btst(v,4),btst(v,3),btst(v,2),
  135.     btst(v,1),btst(v,0) );
  136.     /*printf("%ld\n",strlen(s));*/
  137.     return s;
  138. }
  139. char * intena_h (void) {
  140.     static char s[228];
  141.     return int_h(custom->wdcu_regs[0x01c/2],s,"ena");
  142. }
  143. char * intreq_h (void) {
  144.     static char s[228];
  145.     return int_h(custom->wdcu_regs[0x01e/2],s,"req");
  146. }
  147.  
  148. char * sr_h (void) {
  149.     static char s[56];
  150.     int v = cpu->wdc_sr;
  151.     sprintf(s,"Status Register\nT=%d S=%d M=%d I=%d X=%d N=%d Z=%d V=%d C=%d",
  152.     (v>>14)&3,btst(v,13),btst(v,12),(v>>8)&7,btst(v,4),
  153.     btst(v,3),btst(v,2),btst(v,1),btst(v,0) );
  154.     /*printf("%ld\n",strlen(s));*/
  155.     return s;
  156. }
  157.  
  158. /****************************************************************************/
  159.  
  160. int main(int argc,char *argv[]) {
  161.  
  162.     IntuitionBase = OpenLibrary("intuition.library",39);
  163.     UtilityBase = OpenLibrary("utility.library",39);
  164.     MUIMasterBase = OpenLibrary(MUIMASTER_NAME,MUIMASTER_VMIN);
  165.  
  166.     if ( IntuitionBase && UtilityBase && MUIMasterBase ) {
  167.         if (argc == 2) loaddump(argv[1]); else loaddump(NULL);
  168.         if (header) {
  169.  
  170.             if (wmem_init()) {
  171.     
  172.                 main2();
  173.  
  174.             
  175.                 wmem_finit();
  176.             }
  177.             freedump();
  178.         }
  179.     }
  180.  
  181.     CloseLibrary(MUIMasterBase);
  182.     exit(0);
  183. }
  184.  
  185. /****************************************************************************/
  186.  
  187. void main2() {
  188.  
  189.     APTR win1;
  190.     APTR
  191.         mored0,mored1,mored2,mored3,mored4,mored5,mored6,mored7,
  192.         morea0,morea1,morea2,morea3,morea4,morea5,morea6,
  193.         moreusp,moressp,morepc,
  194.         regd0,regd1,regd2,regd3,regd4,regd5,regd6,regd7,
  195.         rega0,rega1,rega2,rega3,rega4,rega5,rega6,
  196.         regsr,regssp,regusp,regpc,morecpu,
  197.         cudmacon,cuintena,cuintreq,morecust,
  198.         morecias,moremem,moreemem,moreslave,moreinfo,
  199.         a_quit,a_restart,a_cont;
  200.     ULONG signals;
  201.     BOOL running = TRUE;
  202.  
  203.     app = ApplicationObject,
  204.         MUIA_Application_Title,        "WHDLoad GCI",
  205.         MUIA_Application_Version,    "$VER: WHDLoad GCI 1.1 (" __DATE__ ")",
  206.         MUIA_Application_Copyright,    "©1998-2000 by Wepl",
  207.         MUIA_Application_Author,    "Wepl",
  208.         MUIA_Application_Description,    "WHDload Visualisation and Debugging.",
  209.         MUIA_Application_Base,        "WHDLoadGCI",
  210.         MUIA_Application_Menustrip,    MUI_MakeObject(MUIO_MenustripNM,MenuData,0),
  211.         MUIA_Application_Window,    win1 = WindowObject,
  212.             MUIA_Window_Title, "WHDLoad GCI",
  213.             MUIA_Window_ID   , MAKE_ID('M','A','I','N'),
  214.             WindowContents, VGroup,
  215.                 Child, HGroup,
  216.                     Child, HGroup, MUIA_Weight, 100, GroupFrameT("CPU"), MUIA_Group_Columns, 4,
  217.                         Register32BE(mored0,regd0,"D0:",cpu->wdc_regs[0]),
  218.                         Register32BE(morea0,rega0,"A0:",cpu->wdc_regs[8]),
  219.                         Register32BE(mored1,regd1,"D1:",cpu->wdc_regs[1]),
  220.                         Register32BE(morea1,rega1,"A1:",cpu->wdc_regs[9]),
  221.                         Register32BE(mored2,regd2,"D2:",cpu->wdc_regs[2]),
  222.                         Register32BE(morea2,rega2,"A2:",cpu->wdc_regs[10]),
  223.                         Register32BE(mored3,regd3,"D3:",cpu->wdc_regs[3]),
  224.                         Register32BE(morea3,rega3,"A3:",cpu->wdc_regs[11]),
  225.                         Register32BE(mored4,regd4,"D4:",cpu->wdc_regs[4]),
  226.                         Register32BE(morea4,rega4,"A4:",cpu->wdc_regs[12]),
  227.                         Register32BE(mored5,regd5,"D5:",cpu->wdc_regs[5]),
  228.                         Register32BE(morea5,rega5,"A5:",cpu->wdc_regs[13]),
  229.                         Register32BE(mored6,regd6,"D6:",cpu->wdc_regs[6]),
  230.                         Register32BE(morea6,rega6,"A6:",cpu->wdc_regs[14]),
  231.                         Register32BE(mored7,regd7,"D7:",cpu->wdc_regs[7]),
  232.                         Register32BEH(moreusp,regusp,"USP:",cpu->wdc_usp,"User Stack Pointer"),
  233.                         Register16LEH(regsr,"SR:",cpu->wdc_sr,sr_h()),
  234.                         Register32BEH(moressp,regssp,"SSP:",cpu->wdc_ssp,"Supervisor Stack Pointer"),
  235.                         Register32BEH(morepc,regpc,"PC:",cpu->wdc_pc,"Program Counter"),
  236.                         Child, Label2(""), Child, morecpu = SimpleButton("More"),
  237. /*
  238.                     Child, HGroup, GroupFrameT("CPU"),
  239.                         Child, VGroup, MUIA_Weight, 1,
  240.                             Child, mored0 = SimpleButton("D0:"),
  241.                             Child, mored1 = SimpleButton("D1:"),
  242.                             Child, mored2 = SimpleButton("D2:"),
  243.                             Child, mored3 = SimpleButton("D3:"),
  244.                             Child, mored4 = SimpleButton("D4:"),
  245.                             Child, mored5 = SimpleButton("D5:"),
  246.                             Child, mored6 = SimpleButton("D6:"),
  247.                             Child, mored7 = SimpleButton("D7:"),
  248.                             Child, Label2("SR:"),
  249.                             Child, morepc = SimpleButton("PC:"),
  250.                         End,
  251.                         Child, VGroup,
  252.                             Register32E(regd0,cpu->wdc_regs[0]),
  253.                             Register32E(regd1,cpu->wdc_regs[1]),
  254.                             Register32E(regd2,cpu->wdc_regs[2]),
  255.                             Register32E(regd3,cpu->wdc_regs[3]),
  256.                             Register32E(regd4,cpu->wdc_regs[4]),
  257.                             Register32E(regd5,cpu->wdc_regs[5]),
  258.                             Register32E(regd6,cpu->wdc_regs[6]),
  259.                             Register32E(regd7,cpu->wdc_regs[7]),
  260.                             Register16EH(regsr,cpu->wdc_sr,sr_h),
  261.                             Register32EH(regpc,cpu->wdc_pc,"Program Counter"),
  262.                         End,
  263.                         Child, VGroup, MUIA_Weight, 1,
  264.                             Child, morea0 = SimpleButton("A0:"),
  265.                             Child, morea1 = SimpleButton("A1:"),
  266.                             Child, morea2 = SimpleButton("A2:"),
  267.                             Child, morea3 = SimpleButton("A3:"),
  268.                             Child, morea4 = SimpleButton("A4:"),
  269.                             Child, morea5 = SimpleButton("A5:"),
  270.                             Child, morea6 = SimpleButton("A6:"),
  271.                             Child, moreusp = SimpleButton("USP:"),
  272.                             Child, moressp = SimpleButton("SSP:"),
  273.                         End,
  274.                         Child, VGroup,
  275.                             Child, morecpu = SimpleButton("More"),
  276.                         End,
  277. */
  278.                         End,
  279.                     Child, VGroup, MUIA_Weight, 40,
  280.                         Child, VGroup, GroupFrameT("Custom"),
  281.                             Child, HGroup, MUIA_Group_Columns, 2,
  282.                                 RegisterC(cudmacon,"dmacon:",dmacon_h(),custom->wdcu_regs[0x002/2],4),
  283.                                 RegisterC(cuintena,"intena:",intena_h(),custom->wdcu_regs[0x01c/2],4),
  284.                                 RegisterC(cuintreq,"intreq:",intreq_h(),custom->wdcu_regs[0x01e/2],4),
  285.                                 End,
  286.                             Child, morecust = SimpleButton("More"),
  287.                             End,
  288.                         Child, VGroup, GroupFrameT("Misc"),
  289.                             Child, morecias = SimpleButton("Cia's"),
  290.                             Child, moremem = SimpleButton("BaseMem"),
  291.                             ChildIf(emem), moreemem = SimpleButtonIf(emem,"ExpMem"),
  292.                             Child, moreslave = SimpleButton("Slave"),
  293.                             Child, moreinfo = SimpleButton("Info"),
  294.                             End,
  295.                         End,
  296.                     End,
  297.                 ChildIf(term), term ? TextObject, TextFrame,
  298.                     MUIA_Background, MUII_TextBack,
  299.                     MUIA_Text_Contents, term,
  300.                     End : NULL,
  301.                 Child, HGroup, GroupFrameT("Actions"), MUIA_Group_SameWidth, TRUE,
  302.                     Child, a_quit = SimpleButton("Quit"),
  303.                     Child, a_restart = SimpleButton("Restart"),
  304.                     Child, a_cont = SimpleButton("Continue"),
  305.                     End,
  306.                 End,
  307.             End,
  308.         End;
  309.  
  310.     if (app) {
  311.  
  312.     win = win1;
  313.  
  314.     DoMethod(win1,MUIM_Notify,MUIA_Window_CloseRequest,TRUE,app,2,MUIM_Application_ReturnID,MUIV_Application_ReturnID_Quit);
  315.  
  316.     DoMethod(mored0,MUIM_Notify,MUIA_Pressed,FALSE,app,2,MUIM_Application_ReturnID,MAIN_MORED0);
  317.     DoMethod(mored1,MUIM_Notify,MUIA_Pressed,FALSE,app,2,MUIM_Application_ReturnID,MAIN_MORED1);
  318.     DoMethod(mored2,MUIM_Notify,MUIA_Pressed,FALSE,app,2,MUIM_Application_ReturnID,MAIN_MORED2);
  319.     DoMethod(mored3,MUIM_Notify,MUIA_Pressed,FALSE,app,2,MUIM_Application_ReturnID,MAIN_MORED3);
  320.     DoMethod(mored4,MUIM_Notify,MUIA_Pressed,FALSE,app,2,MUIM_Application_ReturnID,MAIN_MORED4);
  321.     DoMethod(mored5,MUIM_Notify,MUIA_Pressed,FALSE,app,2,MUIM_Application_ReturnID,MAIN_MORED5);
  322.     DoMethod(mored6,MUIM_Notify,MUIA_Pressed,FALSE,app,2,MUIM_Application_ReturnID,MAIN_MORED6);
  323.     DoMethod(mored7,MUIM_Notify,MUIA_Pressed,FALSE,app,2,MUIM_Application_ReturnID,MAIN_MORED7);
  324.     DoMethod(morea0,MUIM_Notify,MUIA_Pressed,FALSE,app,2,MUIM_Application_ReturnID,MAIN_MOREA0);
  325.     DoMethod(morea1,MUIM_Notify,MUIA_Pressed,FALSE,app,2,MUIM_Application_ReturnID,MAIN_MOREA1);
  326.     DoMethod(morea2,MUIM_Notify,MUIA_Pressed,FALSE,app,2,MUIM_Application_ReturnID,MAIN_MOREA2);
  327.     DoMethod(morea3,MUIM_Notify,MUIA_Pressed,FALSE,app,2,MUIM_Application_ReturnID,MAIN_MOREA3);
  328.     DoMethod(morea4,MUIM_Notify,MUIA_Pressed,FALSE,app,2,MUIM_Application_ReturnID,MAIN_MOREA4);
  329.     DoMethod(morea5,MUIM_Notify,MUIA_Pressed,FALSE,app,2,MUIM_Application_ReturnID,MAIN_MOREA5);
  330.     DoMethod(morea6,MUIM_Notify,MUIA_Pressed,FALSE,app,2,MUIM_Application_ReturnID,MAIN_MOREA6);
  331.     DoMethod(moreusp,MUIM_Notify,MUIA_Pressed,FALSE,app,2,MUIM_Application_ReturnID,MAIN_MOREUSP);
  332.     DoMethod(moressp,MUIM_Notify,MUIA_Pressed,FALSE,app,2,MUIM_Application_ReturnID,MAIN_MORESSP);
  333.     DoMethod(morepc,MUIM_Notify,MUIA_Pressed,FALSE,app,2,MUIM_Application_ReturnID,MAIN_MOREPC);
  334.     DoMethod(morecpu,MUIM_Notify,MUIA_Pressed,FALSE,app,2,MUIM_Application_ReturnID,MAIN_MORECPU);
  335.     DoMethod(morecust,MUIM_Notify,MUIA_Pressed,FALSE,app,2,MUIM_Application_ReturnID,MAIN_MORECUST);
  336.     DoMethod(moremem,MUIM_Notify,MUIA_Pressed,FALSE,app,2,MUIM_Application_ReturnID,MAIN_MOREMEM);
  337.     DoMethod(moreemem,MUIM_Notify,MUIA_Pressed,FALSE,app,2,MUIM_Application_ReturnID,MAIN_MOREEMEM);
  338.     DoMethod(moreslave,MUIM_Notify,MUIA_Pressed,FALSE,app,2,MUIM_Application_ReturnID,MAIN_MORESLAVE);
  339.     DoMethod(moreinfo,MUIM_Notify,MUIA_Pressed,FALSE,app,2,MUIM_Application_ReturnID,MAIN_MOREINFO);
  340.  
  341.     DoMethod(a_quit,MUIM_Notify,MUIA_Pressed,FALSE,app,2,MUIM_Application_ReturnID,MUIV_Application_ReturnID_Quit);
  342.  
  343.     set(win1,MUIA_Window_Open,TRUE);
  344.     
  345. /*
  346. ** Input loop...
  347. */
  348.  
  349.     while (running)
  350.     {
  351.         ULONG id = DoMethod(app,MUIM_Application_Input,&signals);
  352.  
  353.         switch (id)
  354.         {
  355.             case MEN_QUIT:
  356.             case MUIV_Application_ReturnID_Quit:
  357.                 running = FALSE;
  358.                 break;
  359.  
  360.             case MEN_ABOUT:
  361.                 MUI_Request(app,win1,0,NULL,"OK","\33cWHDLoad Graphical Coders Interface\n"
  362.                     "©1998-2000 Wepl\nAll Rights Reserved.");
  363.                 break;
  364.             case MEN_ABOUTMUI:
  365.                 DoMethod(app,MUIM_Application_AboutMUI,win);
  366.                 break;
  367.  
  368.             case MEN_GOTO0:
  369.             case MEN_GOTO1:
  370.             case MEN_GOTO2:
  371.             case MEN_GOTO3:
  372.             case MEN_GOTO4:
  373.             case MEN_GOTO5:
  374.             case MEN_GOTO6:
  375.             case MEN_GOTO7:
  376.             case MEN_GOTO8:
  377.             case MEN_GOTO9:
  378.                 wmem_goto( id - MEN_GOTO0 );
  379.                 break;
  380.  
  381.             case MAIN_MORECPU:
  382.                 make_win_cpu();
  383.                 break;
  384.             case MAIN_MORECUST:
  385.                 make_win_cust();
  386.                 break;
  387.             case MAIN_MOREMEM:
  388.                 wmem_make(0);
  389.                 break;
  390.             case MAIN_MOREEMEM:
  391.                 if (emem) {
  392.                     wmem_make(header->wdh_ExpMemLog);
  393.                 }
  394.                 break;
  395.             case MAIN_MORESLAVE:
  396.                 wmem_make(header->wdh_SlaveLog);
  397.                 break;
  398.             case MAIN_MOREINFO:
  399.                 make_win_info();
  400.                 break;
  401.             case MAIN_MORED0:
  402.             case MAIN_MORED1:
  403.             case MAIN_MORED2:
  404.             case MAIN_MORED3:
  405.             case MAIN_MORED4:
  406.             case MAIN_MORED5:
  407.             case MAIN_MORED6:
  408.             case MAIN_MORED7:
  409.             case MAIN_MOREA0:
  410.             case MAIN_MOREA1:
  411.             case MAIN_MOREA2:
  412.             case MAIN_MOREA3:
  413.             case MAIN_MOREA4:
  414.             case MAIN_MOREA5:
  415.             case MAIN_MOREA6:
  416.                 wmem_make(cpu->wdc_regs[id-MAIN_MORED0]);
  417.                 break;
  418.             case MAIN_MOREUSP:
  419.                 wmem_make(cpu->wdc_usp);
  420.                 break;
  421.             case MAIN_MORESSP:
  422.                 wmem_make(cpu->wdc_ssp);
  423.                 break;
  424.             case MAIN_MOREPC:
  425.                 wmem_make(cpu->wdc_pc);
  426.                 break;
  427.         }
  428.         if (running && signals) Wait(signals);
  429.     }
  430.  
  431.     set(win1,MUIA_Window_Open,FALSE);
  432.  
  433. /*
  434. ** Shut down...
  435. */
  436.  
  437.     MUI_DisposeObject(app);
  438.  
  439.     }
  440. }
  441.  
  442.